# -*- coding: utf-8 -*-

# 如果你不幸拥有一个多核CPU，你肯定在想，多核应该可以同时执行多个线程。
# 如果写一个死循环的话，会出现什么情况呢？
# 我们可以监控到一个死循环线程会100%占用一个CPU。
# 如果有两个死循环线程，在多核CPU中，可以监控到会占用200%的CPU，也就是占用两个CPU核心。
# 要想把N核CPU的核心全部跑满，就必须启动N个死循环线程。
# 试试用Python写个死循环：

import threading, multiprocessing

def loop():
    x = 0
    while True:
        x = x ^ 1

for i in range(multiprocessing.cpu_count()):
    t = threading.Thread(target=loop)
    t.start()

# GIL是Python的全局解释器锁，同一进程中假如有多个线程运行，
# 一个线程在运行Python程序的时候会霸占Python解释器（加了一把锁即GIL），
# 使该进程内的其他线程无法运行，等该线程运行完后其他线程才能运行。
# 如果线程运行过程中遇到耗时操作，则解释器锁解开，使其他线程运行。
# 所以在多线程中，线程的运行仍是有先后顺序的，并不是同时进行。

# 因为Python的线程虽然是真正的线程，但解释器执行代码时，有一个GIL锁：Global Interpreter Lock，
# 任何Python线程执行前，必须先获得GIL锁，然后，每执行100条字节码，解释器就自动释放GIL锁，
# 让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁，
# 所以，多线程在Python中只能交替执行，即使100个线程跑在100核CPU上，也只能用到1个核。
#
# GIL是Python解释器设计的历史遗留问题，通常我们用的解释器是官方实现的CPython，
# 要真正利用多核，除非重写一个不带GIL的解释器。

